﻿using AttachmentModule.Dime;
using Coordenadas;
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data.Common;
using System.Data.OleDb;
using System.IO;
using System.Security.Principal;
using System.Text.RegularExpressions;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Xml;
using System.Xml.XPath;
using aejw;
//---agregado para transferir archivos
using System.Xml.Serialization;


namespace WebServiceCentral
{
    /// <summary>
    /// Summary description for Service1
    /// </summary>
    [WebService(Namespace = "http://centraldealarmas.cl/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [ToolboxItem(false)]
    public class Central : System.Web.Services.WebService
    {
        public Central()
        { }
        [WebMethod]
        [Dime]
        public XmlDocument Emergencias()
        {
            return EmergenciasGET();
        }

        [WebMethod]
        [Dime]
        public string Hello()
        {
            string drives_st = "";
            String[] drives = Environment.GetLogicalDrives();
            drives_st = String.Join(", ", drives);
            return "Hello " + WindowsIdentity.GetCurrent().Name + drives_st;
        }

        [WebMethod]
        [Dime]
        public string Existe()
        {
            this.ConectaDrive();
            string path = @"m:\SID\Bitacora.mdb";
            string drives_st = "";
            String[] drives = Environment.GetLogicalDrives();
            drives_st=String.Join(", ", drives);
            System.IO.DriveInfo di = new System.IO.DriveInfo(@"m:\");
            System.IO.DirectoryInfo dirInfo = di.RootDirectory;
            System.IO.DirectoryInfo[] dirInfos = dirInfo.GetDirectories("*.*");

            foreach (System.IO.DirectoryInfo d in dirInfos)
            {
                drives_st+=d.Name+Environment.NewLine;
            }


            if (File.Exists(path))
            {
                return "existe " + drives_st;
            }
            else return "no existe" + drives_st;
        }

        [WebMethod]
        [Dime]

        public XmlDocument CarrosActualiza(string nombre, string lat, string lon)
        {
            this.ConectaDrive();
            XmlDocument xdoc;
            string file;
            try
            {
                file = this.config("/config/files/trucks");
                xdoc = new XmlDocument();
                xdoc.Load(file);
            }
            catch (Exception)
            {
                return new XmlDocument();
            }

            XmlNodeList elemList = xdoc.GetElementsByTagName("carro");
            bool encontre = false;
            for (int i = 0; i < elemList.Count; i++)
            {
                if (elemList[i].SelectNodes("nombre")[0].InnerText == nombre)
                {
                    encontre = true;
                    elemList[i].SelectNodes("posicion/lat")[0].InnerText = lat.ToString();
                    elemList[i].SelectNodes("posicion/lon")[0].InnerText = lon.ToString();
                }
            }
            if (!encontre)
            {
                try
                {
                    XmlNode currNode = xdoc.LastChild;
                    XmlDocumentFragment docFrag = xdoc.CreateDocumentFragment();
                    docFrag.InnerXml = "<carro><nombre>" + nombre + "</nombre><posicion><lat>" + lat + "</lat><lon>" + lon + "</lon></posicion><estado></estado><conductor></conductor><observacion></observacion></carro>";
                    // insert the availability node into the document
                    currNode.InsertBefore(docFrag, currNode.LastChild);
                }
                catch (Exception)
                {
                }
            }
            xdoc.Save(file);
            return xdoc;
        }


        [WebMethod]
        [Dime]
        public XmlDocument Carro(string carro)
        {
            this.ConectaDrive();
            XmlDocument xdoc;
            string carpeta;
            try
            {
                carpeta = this.config("/config/folder/trucks");
                xdoc = new XmlDocument();
                xdoc.Load(carpeta + carro + ".xml");
                return xdoc;
            }
            catch (Exception)
            {
                return new XmlDocument();
            }
            
        }

        [WebMethod(Description = "Material Mayor disponible y en servicio (6.8)")]
        [Dime]
        public XmlDocument Carros()
        {
            XmlDocument xdoc;
            string file, pathDB;
            OleDbConnection conexion;
            this.ConectaDrive();
            try
            {
                file = this.config("/config/files/trucks");
                pathDB = this.config("/config/dataBase/tabla");
                xdoc = new XmlDocument();
                xdoc.Load(file);
                conexion = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathDB);
            }
            catch (Exception ex)
            {
                System.Console.WriteLine("Error 1: \n" + ex.StackTrace + "\n" + ex.Message);
                return new XmlDocument();
            }
            OleDbCommand sql = new OleDbCommand("SELECT NombreCarro AS Nombre,Estado,Conductor,TipoEmergencia,Lat,Lon,Comentario from Carros order by NombreCarro", conexion);
            /* Leemos el archivo de coordenadas y creamos el XML */

            try
            {
                conexion.Open();

                //create the datareader object to connect to table
                OleDbDataReader resultados = sql.ExecuteReader();
                while (resultados.Read())
                {
                    bool encontre = false;
                    XmlNodeList elemList = xdoc.GetElementsByTagName("carro");
                    for (int i = 0; i < elemList.Count; i++)
                    {
                       // string datoxml = elemList[i].SelectNodes("Nombre")[0].InnerText;
                        

                        /*--- si existe el carro entonces lo actualiza*/
                        if (elemList[i].SelectNodes("nombre")[0].InnerText == resultados.GetString(0).ToString())
                        {
                            encontre = true;
                            string str0nomb = (resultados.GetValue(0) != "" || resultados.GetValue(0) != null ? resultados.GetValue(0).ToString() : (string)null);
                            string str1esta = (resultados.GetValue(1) != "" || resultados.GetValue(1) != null ? resultados.GetValue(1).ToString() : (string)null);
                            string str2cond = (resultados.GetValue(2) != "" || resultados.GetValue(2) != null ? resultados.GetValue(2).ToString() : (string)null);
                            string str3tipo = (resultados.GetValue(3) != "" || resultados.GetValue(3) != null ? resultados.GetValue(3).ToString() : (string)null);
                            string str4lati = (resultados.GetValue(4) != "" || resultados.GetValue(4) != null ? resultados.GetValue(4).ToString() : (string)null);
                            string str5long = (resultados.GetValue(5) != "" || resultados.GetValue(5) != null ? resultados.GetValue(5).ToString() : (string)null);
                            string str6obse = (resultados.GetValue(6) != "" || resultados.GetValue(6) != null ? resultados.GetValue(6).ToString() : (string)null);

                            elemList[i].SelectNodes("estado")[0].InnerText = str1esta;
                            elemList[i].SelectNodes("conductor")[0].InnerText =str2cond ;
                            elemList[i].SelectNodes("tipoemergencia")[0].InnerText = str3tipo;
                            elemList[i].SelectNodes("observacion")[0].InnerText = str6obse;
                            elemList[i].SelectNodes("posicion/lat")[0].InnerText = str4lati;
                            elemList[i].SelectNodes("posicion/lon")[0].InnerText = str5long;
                           // elemList[i].SelectNodes("posicion/lon")[0].InnerText = str4long;
                           // elemList[i].SelectNodes("posicion/lat")[0].InnerText = str5lati;

                        }
                         
                    }
                    if (!encontre)
                    {
                        try
                        {
                            XmlNode currNode = xdoc.LastChild;
                            XmlDocumentFragment docFrag = xdoc.CreateDocumentFragment();
                            
                            //si en la tabla campos con "null" o "vacio", entonces mostramos ""
                            string str0nomb = (resultados.GetValue(0) != "" || resultados.GetValue(0) != null ? resultados.GetValue(0).ToString() : (string)null);
                            string str1esta = (resultados.GetValue(1) != "" || resultados.GetValue(1) != null ? resultados.GetValue(1).ToString() : (string)null);
                            string str2cond = (resultados.GetValue(2) != "" || resultados.GetValue(2) != null ? resultados.GetValue(2).ToString() : (string)null); 
                            string str3tipo = (resultados.GetValue(3) != "" || resultados.GetValue(3) != null ? resultados.GetValue(3).ToString() : (string)null); 
                            string str4lati = (resultados.GetValue(4) != "" || resultados.GetValue(4) != null ? resultados.GetValue(4).ToString() : (string)null);
                            string str5long = (resultados.GetValue(5) != "" || resultados.GetValue(5) != null ? resultados.GetValue(5).ToString() : (string)null);
                            string str6obse = (resultados.GetValue(6) != "" || resultados.GetValue(6) != null ? resultados.GetValue(6).ToString() : (string)null);

                            docFrag.InnerXml = "<carro><nombre>" + str0nomb + "</nombre><posicion><lat>" + str4lati + "</lat><lon>" + str5long + "</lon></posicion><estado>" + str1esta + "</estado><conductor>" + str2cond + "</conductor><tipoemergencia>" + str3tipo + "</tipoemergencia><observacion>" + str6obse + "</observacion></carro>";
                            // insert the availability node into the document
                            currNode.InsertAfter(docFrag, currNode.LastChild);
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine("Error 2: \n" + ex.StackTrace + "\n" + ex.Message);
                        }
                    }
                }

                //close the reader 
                resultados.Close();

                //close the connection Its important.
                conexion.Close();
            }

            //Some usual exception handling
            catch (Exception e)
            {
                Console.WriteLine("Error 3: \n" + e.StackTrace + "\n" + e.Message);
            }

            xdoc.Save(file);
            return xdoc;
        }

        [WebMethod]
        [Dime]
        public XmlDocument Llamados()
        {
            return LlamadosGET();
        }
        [WebMethod]
        public XmlDocument LlamadosGET()
        {
            this.ConectaDrive();
            StreamWriter sw = new StreamWriter(@"c:\WebServices\log.txt");
            StreamWriter sw2 = new StreamWriter(this.config("/config/folder/SID")+"tmp.txt");
            sw2.WriteLine("Escribi2");
            sw2.Close();
            OleDbConnection conexion;
            /* Leemos el archivo de Llamdos y creamos el XML */
            MemoryStream mst = new MemoryStream();
            XmlTextWriter xmlw = new XmlTextWriter(mst, null);
            xmlw.Formatting = Formatting.Indented;
            xmlw.WriteStartDocument(true);
            xmlw.WriteStartElement("llamados");
            string conexion_string = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + this.config("/config/dataBase/bitacora");
           //string conexion_string = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + @"\\Central0\Datos\SID\Bitacora.mdb";
            sw.WriteLine("Conexion" + conexion_string+"\n");
            sw.WriteLine("Usuario" + WindowsIdentity.GetCurrent().Name);
            try
            {
                sw.WriteLine("Intentamos conectar");
                conexion = new OleDbConnection(conexion_string);
                /* Si econtramos el archivo entonces creamos los nodos de emergencias */

            }
            catch (Exception ex)
            {
                System.Console.WriteLine("Error 1: \n" + ex.StackTrace + "\n" + ex.Message);
                sw.WriteLine("Error 1: \n" + ex.StackTrace + "\n" + ex.Message);
                xmlw.WriteAttributeString("error", ex.Message);
                xmlw.WriteAttributeString("path", conexion_string);
                xmlw.WriteEndDocument();
                xmlw.Flush();
                mst.Seek(0, System.IO.SeekOrigin.Begin);
                XmlDocument xmlRET = new XmlDocument();
                xmlRET.Load(mst);
                xmlw.Close();
                mst.Close();
                sw.Close();
                return xmlRET;
            }
            /* Con esta consulta pedimos los ultimos 10 llamados */
            OleDbCommand sql = new OleDbCommand("SELECT TOP 10 Correlativo, Fecha, Hora, Acto, Clave, Lat, Lon, Direccion, Observacion FROM UltimosLlamados ORDER BY Fecha DESC, Hora DESC", conexion);
            try
            {
                sw.WriteLine("Intentamos abrir conexion");
                conexion.Open();
                sw.WriteLine("abrimos");
                //create the datareader object to connect to table
                OleDbDataReader resultados = sql.ExecuteReader();
                while (resultados.Read())
                {
                    //si en la tabla campos con "null" o "vacio", entonces mostramos ""
                    string str0corr = (resultados.GetValue(0) != "" || resultados.GetValue(0) != null ? resultados.GetValue(0).ToString() : (string)null);
                    string str1fech = (resultados.GetValue(1) != "" || resultados.GetValue(1) != null ? resultados.GetDateTime(1).ToShortDateString() : (string)null);
                    string str2hora = (resultados.GetValue(2) != "" || resultados.GetValue(2) != null ? resultados.GetDateTime(2).ToShortTimeString() : (string)null);
                    string str3acto = (resultados.GetValue(3) != "" || resultados.GetValue(3) != null ? resultados.GetValue(3).ToString() : (string)null);
                    string str4clav = (resultados.GetValue(4) != "" || resultados.GetValue(4) != null ? resultados.GetValue(4).ToString() : (string)null);
                    string str5lati = (resultados.GetValue(5) != "" || resultados.GetValue(5) != null ? resultados.GetValue(5).ToString() : (string)null);
                    string str6long = (resultados.GetValue(6) != "" || resultados.GetValue(6) != null ? resultados.GetValue(6).ToString() : (string)null);
                    string str7dire = (resultados.GetValue(7) != "" || resultados.GetValue(7) != null ? resultados.GetValue(7).ToString() : (string)null);
                    string str8obse = (resultados.GetValue(8) != "" || resultados.GetValue(8) != null ? resultados.GetValue(8).ToString() : (string)null);

                    // Creamos un nodo de llamado
                    xmlw.WriteStartElement("llamado");

                    // Colocamos el correlativo
                    xmlw.WriteStartElement("correlativo");
                    xmlw.WriteString(str0corr);
                    xmlw.WriteEndElement();

                    // Colocamos la fecha
                    xmlw.WriteStartElement("fecha");
                    xmlw.WriteString(str1fech);
                    xmlw.WriteEndElement();

                    // Colocamos hora
                    xmlw.WriteStartElement("hora");
                    xmlw.WriteString(str2hora);
                    xmlw.WriteEndElement();

                    // Colocamos acto
                    xmlw.WriteStartElement("acto");
                    xmlw.WriteString(str3acto);
                    xmlw.WriteEndElement();

                    // Colocamos clave
                    xmlw.WriteStartElement("clave");
                    xmlw.WriteString(str4clav);
                    xmlw.WriteEndElement();

                    // Colocamos latitud
                    xmlw.WriteStartElement("latitud");
                    xmlw.WriteString(str5lati);
                    xmlw.WriteEndElement();

                    // Colocamos longitud
                    xmlw.WriteStartElement("longitud");
                    xmlw.WriteString(str6long);
                    xmlw.WriteEndElement();

                    // Colocamos direccion
                    xmlw.WriteStartElement("direccion");
                    xmlw.WriteString(str7dire);
                    xmlw.WriteEndElement();

                    // Colocamos observacion
                    xmlw.WriteStartElement("observacion");
                    xmlw.WriteString(str8obse);
                    xmlw.WriteEndElement();

                    // Cerramos el nodo de llamado
                    xmlw.WriteEndElement();
 
/*                    // Creamos un nodo de llamado
                    xmlw.WriteStartElement("llamado");
                    // Colocamos el tipo
                    xmlw.WriteStartElement("tipo");
                    xmlw.WriteString(str4clav);
                    xmlw.WriteEndElement();
                    // Colocamos el detalle
                    xmlw.WriteStartElement("detalle");
                    xmlw.WriteString(str8obse);
                    xmlw.WriteEndElement();
                    // Colocamos el direccion
                    xmlw.WriteStartElement("direccion");
                    xmlw.WriteString(str7dire);
                    xmlw.WriteEndElement();
                    // Colocamos el sector
                    xmlw.WriteStartElement("sector");
                    xmlw.WriteString(str8obse);
                    xmlw.WriteEndElement();
                    // Colocamos el fecha
                    xmlw.WriteStartElement("fecha");
                    xmlw.WriteString(str1fech);
                    xmlw.WriteEndElement();

                    // Colocamos el hora
                    xmlw.WriteStartElement("hora");
                    xmlw.WriteString(str2hora);
                    xmlw.WriteEndElement();

                    // Colocamos el numero de llamado
                    xmlw.WriteStartElement("numero");
                    xmlw.WriteString(str0corr);
                    xmlw.WriteEndElement();

                    // Cerramos el nodo de llamado
                    xmlw.WriteEndElement();
 */ 
                }

                //close the reader 
                resultados.Close();

                //close the connection Its important.
                conexion.Close();
            }

            //Some usual exception handling
            catch (Exception e)
            {
                System.Console.WriteLine("Error 2: \n" + e.StackTrace + "\n" + e.Message);
                sw.WriteLine("Error 2: \n" + e.StackTrace + "\n" + e.Message);
                sw.Close();
                return new XmlDocument();
            }
            try
            {
                xmlw.WriteEndDocument();
                xmlw.Flush();
                mst.Seek(0, System.IO.SeekOrigin.Begin);
                XmlDocument xmlRET = new XmlDocument();
                xmlRET.Load(mst);
                xmlw.Close();
                mst.Close();
                sw.Close();
                return xmlRET;
            }
            catch (Exception e)
            {
                System.Console.WriteLine("Error 3: \n" + e.StackTrace + "\n" + e.Message);
                sw.WriteLine("Error 3: \n" + e.StackTrace + "\n" + e.Message);
                sw.Close();
            }
            sw.Close();
            return new XmlDocument();
        }

/// <summary>
/// Modulo para obtener un XML de los Carros que asisten a un llamado
/// </summary>
/// <returns></returns>
        [WebMethod]
        public XmlDocument LlamadoCarros(string idEmergencia)
        {
            this.ConectaDrive();
            StreamWriter sw = new StreamWriter(@"c:\WebServices\log.txt");
            StreamWriter sw2 = new StreamWriter(this.config("/config/folder/SID") + "tmp.txt");
            sw2.WriteLine("Escribi2");
            sw2.Close();
            OleDbConnection conexion;
            MemoryStream mst = new MemoryStream();
            XmlTextWriter xmlw = new XmlTextWriter(mst, null);
            xmlw.Formatting = Formatting.Indented;
            xmlw.WriteStartDocument(true);
            xmlw.WriteStartElement("llamadocarros");


            /*cadena de conexion*/
            string conexion_string = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + this.config("/config/dataBase/bitacora");

            sw.WriteLine("Conexion" + conexion_string + "\n");
            sw.WriteLine("Usuario" + WindowsIdentity.GetCurrent().Name);
            try
            {
                sw.WriteLine("Intentamos conectar");
                conexion = new OleDbConnection(conexion_string);
                /* Si econtramos el archivo entonces creamos los nodos de emergencias */

            }
            catch (Exception ex)
            {
                System.Console.WriteLine("Error 1: \n" + ex.StackTrace + "\n" + ex.Message);
                sw.WriteLine("Error 1: \n" + ex.StackTrace + "\n" + ex.Message);
                xmlw.WriteAttributeString("error", ex.Message);
                xmlw.WriteAttributeString("path", conexion_string);
                xmlw.WriteEndDocument();
                xmlw.Flush();
                mst.Seek(0, System.IO.SeekOrigin.Begin);
                XmlDocument xmlRET = new XmlDocument();
                xmlRET.Load(mst);
                xmlw.Close();
                mst.Close();
                sw.Close();
                return xmlRET;
            }

            // Con esta consulta pedimos los ultimos 10 llamados  a=\"" + numero + "\" AND Datos.Motivo=\"Tono\" ORDER BY Datos.Maquina"
            OleDbCommand sql = new OleDbCommand("SELECT LLC.IdEmergencia, LLC.Carro, LLC.HoraDespacho, C.Estado, C.Conductor,c.Lat, c.Lon FROM Carros AS C INNER JOIN LlamadoCarros AS LLC ON C.NombreCarro = LLC.Carro WHERE  ((LLC.Carro=C.NombreCarro) AND (LLC.IdEmergencia=\""+idEmergencia+"\"))",conexion);
            try
            {
                sw.WriteLine("Intentamos abrir conexion");
                conexion.Open();
                sw.WriteLine("abrimos");
                //create the datareader object to connect to table
                OleDbDataReader resultados = sql.ExecuteReader();
                while (resultados.Read())
                {
                    //si en la tabla campos con "null" o "vacio", entonces mostramos ""
                    //string str0IdEm = (resultados.GetValue(0) != "" || resultados.GetValue(0) != null ? resultados.GetValue(0).ToString() : (string)null);
                    string str1Carr = (resultados.GetValue(1) != "" || resultados.GetValue(1) != null ? resultados.GetValue(1).ToString() : (string)null);
                    string str2HoDe = (resultados.GetValue(2) != "" || resultados.GetValue(2) != null ? resultados.GetDateTime(2).ToShortTimeString() : (string)null);
                    string str3Esta = (resultados.GetValue(3) != "" || resultados.GetValue(3) != null ? resultados.GetValue(3).ToString() : (string)null);
                    string str4Cond = (resultados.GetValue(4) != "" || resultados.GetValue(4) != null ? resultados.GetValue(4).ToString() : (string)null);
                    string str5Lati = (resultados.GetValue(5) != "" || resultados.GetValue(5) != null ? resultados.GetValue(5).ToString() : (string)null);
                    string str6Long = (resultados.GetValue(6) != "" || resultados.GetValue(6) != null ? resultados.GetValue(6).ToString() : (string)null);

                    // Creamos un nodo de llamado
                    xmlw.WriteStartElement("carro");

                    // Colocamos el correlativo
                    xmlw.WriteStartElement("nombrecarro");
                    xmlw.WriteString(str1Carr);
                    xmlw.WriteEndElement();

                    // Colocamos la fecha
                    xmlw.WriteStartElement("horadespacho");
                    xmlw.WriteString(str2HoDe);
                    xmlw.WriteEndElement();

                    // Colocamos hora
                    xmlw.WriteStartElement("estado");
                    xmlw.WriteString(str3Esta);
                    xmlw.WriteEndElement();

                    // Colocamos acto
                    xmlw.WriteStartElement("conductor");
                    xmlw.WriteString(str4Cond);
                    xmlw.WriteEndElement();

                    // creamos el nodo Ubicacion
                    xmlw.WriteStartElement("ubicacion");

                        // Colocamos latitud
                        xmlw.WriteStartElement("lat");
                        xmlw.WriteString(str5Lati);
                        xmlw.WriteEndElement();

                        // Colocamos longitud
                        xmlw.WriteStartElement("lon");
                        xmlw.WriteString(str6Long);
                        xmlw.WriteEndElement();
                    //cerramos nodo ubicacion
                    xmlw.WriteEndElement();


                    // Cerramos el nodo de llamado
                    xmlw.WriteEndElement();

                }

                //close the reader 
                resultados.Close();

                //close the connection Its important.
                conexion.Close();
            }

            //Some usual exception handling
            catch (Exception e)
            {
                System.Console.WriteLine("Error 2: \n" + e.StackTrace + "\n" + e.Message);
                sw.WriteLine("Error 2: \n" + e.StackTrace + "\n" + e.Message);
                sw.Close();
                return new XmlDocument();
            }
            try
            {
                xmlw.WriteEndDocument();
                xmlw.Flush();
                mst.Seek(0, System.IO.SeekOrigin.Begin);
                XmlDocument xmlRET = new XmlDocument();
                xmlRET.Load(mst);
                xmlw.Close();
                mst.Close();
                sw.Close();
                return xmlRET;
            }
            catch (Exception e)
            {
                System.Console.WriteLine("Error 3: \n" + e.StackTrace + "\n" + e.Message);
                sw.WriteLine("Error 3: \n" + e.StackTrace + "\n" + e.Message);
                sw.Close();
            }
            sw.Close();
            return new XmlDocument();
        }


        [WebMethod]
        [Dime]
        public void Llamado(string numero)
        {
            MemoryStream mst = new MemoryStream();
            XmlDocument tmp = LlamadoGET(numero);
            DimeAttribute att = new DimeAttribute();
            try
            {
                tmp.Save(mst);
                att.ResponseAttachments.Add(new DimeAttachment(mst.GetBuffer(), "text/xml"));
            }
            catch (Exception e)
            {
                System.Console.WriteLine("Error 3: \n" + e.StackTrace + "\n" + e.Message);
            }
            return;
        }
        [WebMethod]
        public XmlDocument LlamadoGET(string numero)
        {
            StreamWriter sw = new StreamWriter(@"c:\WebServices\log.txt");
            sw.AutoFlush = true;
            sw.WriteLine("Me llama" + Environment.NewLine);
            
            string pathDB, pathRASE;
            OleDbConnection conexion, conexion2;
            DimeAttribute att = new DimeAttribute();
            sw.WriteLine("Conecto drive" + Environment.NewLine);
            this.ConectaDrive();
            sw.WriteLine("Conecte drive" + Environment.NewLine);
            /* Leemos el archivo de coordenadas y creamos el XML */
            MemoryStream mst = new MemoryStream();
            XmlTextWriter xmlw = new XmlTextWriter(mst, null);
            try
            {
                sw.WriteLine("Dentro try" + Environment.NewLine);
                pathDB = this.config("/config/dataBase/bitacora");
                pathRASE = this.config("/config/dataBase/rase");
                conexion = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathDB);
                conexion2 = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathRASE);
                xmlw.Formatting = Formatting.Indented;
                xmlw.WriteStartDocument(true);
                xmlw.WriteStartElement("llamado");
                /* Si econtramos el archivo entonces creamos los nodos de emergencias */

            }
            catch (Exception ex)
            {
                sw.WriteLine("Error 1: \n" + ex.StackTrace + "\n" + ex.Message);
                return new XmlDocument();
            }

            /* Con esta consulta pedimos los llamados de los ultimos 3 dias */
            OleDbCommand sql_llamado = new OleDbCommand("SELECT Datos.Fecha, Datos.Hora, Datos.NumAla, Datos.Sector, Datos.Maquina, Datos.Motivo, Datos.Comentario FROM Datos WHERE Datos.NumAla=\"" + numero + "\" AND Maquina like \"Detalle%\"", conexion);
            OleDbCommand sql_despachados = new OleDbCommand("SELECT Datos.Fecha, Datos.Hora, Datos.Maquina, Datos.Motivo, Datos.Comentario FROM Datos WHERE  Datos.NumAla=\"" + numero + "\" AND Datos.Motivo=\"Tono\" ORDER BY Datos.Maquina", conexion);
            OleDbCommand sql_direccion = new OleDbCommand("SELECT RASE.Dirección, RASE.Esquina, RASE.Numero FROM RASE WHERE  Rase.Correlativo=" + numero, conexion2);
            /* Nos traera todos los datos de los carros despachados */
            List<string> inCarros = new List<string>();
            try
            {
                sw.WriteLine("Abro la primera conexion"+Environment.NewLine);
                conexion.Open();
                sw.WriteLine("Abro la segunda conexon" + Environment.NewLine);
                conexion2.Open();
                sw.WriteLine("Tengo las dos abiertas" + Environment.NewLine);
                ArrayList carrosDespachados = new ArrayList();
                ArrayList carrosEstados = new ArrayList();
                OleDbDataReader resultados_despachados, resultados_llamado, resultados_direccion;
                resultados_despachados = resultados_llamado = resultados_direccion = null;
                //create the datareader object to connect to table
                try
                {
                    resultados_despachados = sql_despachados.ExecuteReader();
                }
                catch (Exception ex)
                {
                    sw.WriteLine("Error consulta despachados\n" + sql_despachados.CommandText + "\n" + ex.Message);
                }
                try
                {
                    resultados_llamado = sql_llamado.ExecuteReader();
                }
                catch (Exception ex)
                {
                    sw.WriteLine("Error consulta llamado\n" + sql_llamado.CommandText + "\n" + ex.Message);
                }
                try
                {
                    resultados_direccion = sql_direccion.ExecuteReader();
                }
                catch (Exception ex)
                {
                    sw.WriteLine("Error consulta direccion\n" + sql_direccion.CommandText + "\n" + ex.Message);
                }
                if (resultados_despachados == null || resultados_llamado == null || resultados_direccion == null)
                {
                    sw.WriteLine("Todo null");
                    return new XmlDocument();
                }
                while (resultados_llamado.Read())
                {

                    // Colocamos el tipo
                    xmlw.WriteStartElement("tipo");
                    xmlw.WriteString(resultados_llamado.GetString(5));
                    xmlw.WriteEndElement();
                    // Colocamos el detalle
                    xmlw.WriteStartElement("detalle");
                    xmlw.WriteString(resultados_llamado.GetString(4).Substring(8));
                    xmlw.WriteEndElement();
                    // Colocamos el direccion
                    xmlw.WriteStartElement("direccion");
                    // xmlw.WriteString(resultados_llamado.GetString(6).Substring(10).Trim());
                    if (resultados_direccion.Read())
                    {
                        try
                        {
                            xmlw.WriteString(resultados_direccion.GetValue(0).ToString() + " " + resultados_direccion.GetValue(2).ToString() + " // " + resultados_direccion.GetValue(1).ToString());
                        }
                        catch (Exception ex)
                        {
                            for (int i = 0; i < resultados_direccion.FieldCount; i++)
                                sw.WriteLine("\n" + i + "=" + resultados_direccion.GetDataTypeName(i) + "\n" + resultados_direccion.GetValue(i).ToString());
                            sw.WriteLine("Error direccion\nHabian: " + resultados_direccion.FieldCount + "\n" + ex.Message);
                        }
                    }
                    xmlw.WriteEndElement();
                    // Colocamos el sector
                    xmlw.WriteStartElement("sector");
                    xmlw.WriteString(resultados_llamado.GetString(3));
                    xmlw.WriteEndElement();
                    // Colocamos el fecha
                    xmlw.WriteStartElement("fecha");
                    xmlw.WriteString(resultados_llamado.GetDateTime(0).ToShortDateString());
                    xmlw.WriteEndElement();

                    // Colocamos el hora
                    xmlw.WriteStartElement("hora");
                    xmlw.WriteString(resultados_llamado.GetDateTime(1).ToShortTimeString());
                    xmlw.WriteEndElement();

                    // Colocamos el numero de llamado
                    xmlw.WriteStartElement("numero");
                    xmlw.WriteString(resultados_llamado.GetString(2).ToString());
                    xmlw.WriteEndElement();
                }

                foreach (DbDataRecord rec in resultados_despachados)
                {
                    carrosDespachados.Add(rec);
                }
                resultados_despachados.Close();
                carrosDespachados.Sort(0, carrosDespachados.Count, new ComparaCompanias(2));
                xmlw.WriteStartElement("despachados");
                for (int i = 0; i < carrosDespachados.Count; i++)
                {

                    //System.Console.WriteLine("Carros: " + (carrosDespachados[i] as DbDataRecord).GetString(2));
                    xmlw.WriteStartElement("carro");
                    // Colocamos el tipo
                    xmlw.WriteStartElement("nombre");
                    xmlw.WriteString((carrosDespachados[i] as DbDataRecord).GetString(2));
                    xmlw.WriteEndElement();
                    inCarros.Add((carrosDespachados[i] as DbDataRecord).GetString(2));

                    // Colocamos el fecha
                    xmlw.WriteStartElement("fecha");
                    xmlw.WriteString((carrosDespachados[i] as DbDataRecord).GetDateTime(0).ToShortDateString());
                    xmlw.WriteEndElement();

                    // Colocamos el hora
                    xmlw.WriteStartElement("hora");
                    xmlw.WriteString((carrosDespachados[i] as DbDataRecord).GetDateTime(1).ToShortTimeString());
                    xmlw.WriteEndElement();

                    // Cerramos el nodo del carro
                    xmlw.WriteEndElement();
                }
                xmlw.WriteEndElement();
                string carroActual = "";
                OleDbDataReader resultados_estados = null;
                for (int i = 0; i < inCarros.Count; i++)
                {
                    resultados_estados = null;
                    carroActual = inCarros[i];
                    OleDbCommand sql_estados = new OleDbCommand("SELECT Datos.Fecha, Datos.Hora, Datos.Motivo, Datos.Comentario FROM Datos WHERE Datos.Maquina =\"" + carroActual + "\" AND Datos.NumAla=\"" + numero + "\" ORDER BY Datos.Fecha, Datos.Hora", conexion);
                    try
                    {
                        resultados_estados = sql_estados.ExecuteReader();
                    }
                    catch (Exception ex)
                    {
                        sw.WriteLine("Error consulta estados\n" + sql_estados.CommandText + "\n" + ex.Message);
                    }
                    if (resultados_estados == null)
                        continue;
                    xmlw.WriteStartElement("carro");
                    xmlw.WriteStartElement("nombre");
                    xmlw.WriteString(carroActual);
                    xmlw.WriteEndElement();

                    while (resultados_estados.Read())
                    {
                        xmlw.WriteStartElement("estado");
                        xmlw.WriteStartElement("nombre");
                        xmlw.WriteString(resultados_estados.GetString(2));
                        xmlw.WriteEndElement();
                        if (resultados_estados.GetString(2) == "6-0")
                        {
                            //System.Console.WriteLine("A cargo: " + (carrosEstados[i] as DbDataRecord).GetString(4));
                            xmlw.WriteStartElement("conforme");
                            xmlw.WriteString(resultados_estados.GetString(3));
                            xmlw.WriteEndElement();
                        }

                        // Colocamos el fecha
                        //System.Console.WriteLine("Fecha: " + (carrosEstados[i] as DbDataRecord).GetDateTime(0).ToShortDateString());
                        xmlw.WriteStartElement("fecha");
                        xmlw.WriteString(resultados_estados.GetDateTime(0).ToShortDateString());
                        xmlw.WriteEndElement();

                        // Colocamos el hora
                        xmlw.WriteStartElement("hora");
                        //System.Console.WriteLine("Hora: " + (carrosEstados[i] as DbDataRecord).GetDateTime(1).ToShortDateString());
                        xmlw.WriteString(resultados_estados.GetDateTime(1).ToShortTimeString());
                        xmlw.WriteEndElement();
                        xmlw.WriteEndElement();
                    }
                    xmlw.WriteEndElement();
                }
                conexion.Close();
                conexion2.Close();
            }

            //Some usual exception handling
            catch (Exception e)
            {
                sw.WriteLine("Error 2: \n" + e.StackTrace + "\n" + e.Message + "\n" + e.HelpLink);
                conexion.Close();
                conexion2.Close();
                sw.Close();
            }
            try
            {
                xmlw.WriteEndDocument();
                xmlw.Flush();
                mst.Seek(0, System.IO.SeekOrigin.Begin);
                XmlDocument xmlRET = new XmlDocument();
                xmlRET.Load(mst);
                xmlw.Close();
                mst.Close();
                sw.Close();
                return xmlRET;
            }
            catch (Exception e)
            {
                sw.WriteLine("Error 3: \n" + e.StackTrace + "\n" + e.Message);
                sw.Close();
            }
            sw.Close();
            return new XmlDocument();
        }
        [WebMethod]
        public XmlDocument EmergenciasGET()
        {
            StreamReader archivo;
            this.ConectaDrive();
            try
            {
                archivo = new StreamReader(new FileStream(this.config("/config/files/coordinates"), FileMode.Open, FileAccess.Read));
            }
            catch (Exception)
            {
                archivo = null;
            }
            DimeAttribute att = new DimeAttribute();
            /* Leemos el archivo de coordenadas y creamos el XML */
            MemoryStream mst = new MemoryStream();
            XmlTextWriter xmlw = new XmlTextWriter(mst, null);
            xmlw.Formatting = Formatting.Indented;
            xmlw.WriteStartDocument(false);
            xmlw.WriteStartElement("lugares");
            /* Si econtramos el archivo entonces creamos los nodos de emergencias */
            if (archivo != null)
            {
                string linea;
                while (!archivo.EndOfStream)
                {
                    linea = archivo.ReadLine().Trim('"');
                    string[] atributos = linea.Split(';');
                    xmlw.WriteStartElement("emergencia");
                    xmlw.WriteAttributeString("lugar", atributos[0]);
                    xmlw.WriteAttributeString("zona", "19 H");
                    /* Eliminamos las comas con las que vengan las coordenadas */
                    int coma_este = atributos[1].IndexOf(',');
                    int coma_norte = atributos[2].IndexOf(',');

                    int este = 0;
                    int norte = 0;
                    if (coma_este > 0)
                        este = Int32.Parse(atributos[1].Substring(0, coma_este));
                    else
                        este = Int32.Parse(atributos[1]);

                    if (coma_norte > 0)
                        norte = Int32.Parse(atributos[2].Substring(0, coma_norte));
                    else
                        norte = Int32.Parse(atributos[2]);

                    UTM coordenadas = new UTM(este, norte, "19 H");
                    ConversionCoordenadas cc = new ConversionCoordenadas();
                    double[] latlon = cc.utm2LatLon("19 H " + coordenadas.Este + " " + coordenadas.Norte);
                    //xmlw.WriteAttributeString("lat", latlon[0] + "");
                    //xmlw.WriteAttributeString("lon", latlon[1] + "");
                    xmlw.WriteAttributeString("lat", atributos[1] + "");
                    xmlw.WriteAttributeString("lon", atributos[2] + "");

                    xmlw.WriteEndElement();
                }
                archivo.Close();
            }
            xmlw.WriteEndElement();
            xmlw.WriteEndDocument();
            xmlw.Flush();
            mst.Seek(0, System.IO.SeekOrigin.Begin);
            XmlDocument xmlRET = new XmlDocument();
            xmlRET.Load(mst);
            xmlw.Close();
            mst.Close();
            return xmlRET;
        }

        /*
 * realizar el web service para recibir y enviar archivos
 * 
 */


        [WebMethod]
        [Dime]
        public byte[] GetFile(string filename)
        {
            //BinaryReader binReader = new BinaryReader(File.Open(Server.MapPath(filename),FileMode.Open,FileAccess.Read));
            BinaryReader binReader = new BinaryReader(File.Open(filename, FileMode.Open, FileAccess.Read));
            binReader.BaseStream.Position = 0;
            byte[] binFile = binReader.ReadBytes(Convert.ToInt32(binReader.BaseStream.Length));
            binReader.Close();            
            return binFile;
        }

        [WebMethod]
        [Dime]
        public void PutFile(byte[] buffer, string filename)
        {
            BinaryWriter binWriter = new
            BinaryWriter(File.Open(filename, FileMode.CreateNew, FileAccess.ReadWrite));
            binWriter.Write(buffer);
            binWriter.Close();
        }
        public string config(string path){
            //string file = @"C:\WebServices\bin\config.xml";
            
            //---obtener del config.xml, basado en la ruta de la aplicacion 
            string ruta=System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase);
            string file = ruta+"\\config.xml";
            XmlDocument doc = new XmlDocument();
            doc.Load(file);
            //---retornar el nodo de acuerdo al path enviado           

            return doc.SelectNodes(path)[0].InnerText;
        }
        public void ConectaDrive() {
          
            aejw.cNetworkDrive netDrive = new aejw.cNetworkDrive();
            string nDrive="";
            string recursoCompartido="";
            string user="";
            string password="";
            //---buscamos en el archivo bin/config.xml el tag netdrive
            try
            {
                nDrive = this.config("/config/remoteComputer/netdrive");
                recursoCompartido = this.config("/config/remoteComputer/name");
                user = this.config("/config/remoteComputer/user");
                password = this.config("/config/remoteComputer/password");
            }
            catch (Exception ex)
            {
                System.Console.WriteLine("Error 1: \n" + ex.StackTrace + "\n" + ex.Message);
            }

            if (netDrive.IsNetworkDrive(nDrive))
                return;
            netDrive.LocalDrive = nDrive;
            netDrive.ShareName = recursoCompartido;
            netDrive.MapDrive(user,password);

            //netDrive.ShareName = @"\\manuel-nb\Data";
            //netDrive.ShareName = @"\\Central0\Datos";
            //netDrive.MapDrive("david","david");

        }

       public void DesconectaDrive() {
            aejw.cNetworkDrive netDrive = new aejw.cNetworkDrive();
            netDrive.LocalDrive = "m:";
            netDrive.UnMapDrive();
        }
    }
    public class ComparaCompanias : IComparer
    {
        private int campo;
        public ComparaCompanias(int x)
        {
            //System.Console.WriteLine("Llamaron a hacerlo");
            this.campo = x;
        }
        public ComparaCompanias()
        {
            this.campo = 0;
        }

        public int Compare(object x, object y)
        {
            //System.Console.WriteLine("Pide comparar");
            string divisor = @"([a-zA-Z]{1,2})([0-9]{1,2})$";
            Regex rx = new Regex(divisor);
            //System.Console.WriteLine("Hice Regex");
            if (!(x is DbDataRecord) || !(y is DbDataRecord))
            {
                throw new ArgumentException("Objects must be of type DbDataRecord.");
            }
            //System.Console.WriteLine("Campo=" + this.campo + "\nCarro x:" + (x as DbDataRecord).GetString(this.campo) + "\nCarro y:" + (y as DbDataRecord).GetString(this.campo));
            string[] carroX = rx.Split((x as DbDataRecord).GetString(this.campo).Trim());

            //for (int i = 0; i < carroX.Length;i++ )
            //    System.Console.WriteLine(i+"=-"+carroX[i]+"-");

            //System.Console.WriteLine("X dio" + carroX.Length);

            string[] carroY = rx.Split((y as DbDataRecord).GetString(this.campo));
            //System.Console.WriteLine("Y dio" + carroX.Length);
            int compCompanias = int.Parse(carroX[2]).CompareTo(int.Parse(carroY[2]));
            //try
            //{
            //System.Console.WriteLine("----------------------------------------\nCarro x:" + (x as DbDataRecord).GetString(this.campo) + "\nCarro y:" + (y as DbDataRecord).GetString(this.campo));
            //System.Console.WriteLine("Compania x:" + carroX[2] + "\nCompania y:" + carroY[2] + "\nComparacion=" + compCompanias);
            //System.Console.WriteLine("Carro x:" + carroX[1] + "\nCarro y:" + carroY[1] + "\nComparacion=" + carroX[1].CompareTo(carroY[1]));
            //}
            //catch (Exception e) {
            //    System.Console.WriteLine("Error Comparador: "+e.Message);
            //}
            if (compCompanias != 0)
            {
                //System.Console.WriteLine("Por companias");
                return compCompanias;
            }
            else
            {
                //System.Console.WriteLine("Por carros");
                return carroX[1].CompareTo(carroY[1]);
            }
        }



         
    }
}
